/*
 * EnumerationValuePropertyEditor.java
 *
 * Created on March 28, 2006, 3:49 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package org.jdesktop.beans.editors;

import java.beans.PropertyEditorSupport;
import java.util.HashMap;
import java.util.Map;

import org.jdesktop.beans.EnumerationValue;

/**
 *
 * @author Richard
 */
public abstract class EnumerationValuePropertyEditor extends PropertyEditorSupport {
	private String[] tags;
	private Map<Object, EnumerationValue> values = new HashMap<Object, EnumerationValue>();
	private EnumerationValue defaultValue;

	/** Creates a new instance of EnumerationValuePropertyEditor */
	public EnumerationValuePropertyEditor(EnumerationValue defaultEnum, EnumerationValue... enums) {
		this.defaultValue = defaultEnum;
		for (EnumerationValue v : enums) {
			values.put(v.getValue(), v);
		}

		tags = new String[enums.length];
		int index = 0;
		for (EnumerationValue v : enums) {
			tags[index++] = v.getName();
		}
	}

	@Override
	public String getJavaInitializationString() {
		EnumerationValue value = values.get(getValue());
		if (value == null) {
			return defaultValue == null ? "null" : defaultValue.getJavaInitializationString();
		} else {
			return value.getJavaInitializationString();
		}
	}

	@Override
	public String[] getTags() {
		return tags;
	}

	@Override
	public String getAsText() {
		EnumerationValue value = values.get(getValue());
		if (value == null) {
			return defaultValue == null ? null : defaultValue.getName();
		} else {
			return value.getName();
		}
	}

	@Override
	public void setAsText(String text) throws IllegalArgumentException {
		EnumerationValue v = getValueByName(text);
		if (v == null) {
			// hmmmm, try again but trim text
			if (text != null) {
				v = getValueByName(text.trim());
			}
		}

		if (v == null) {
			v = defaultValue;
		}

		setValue(v == null ? null : v.getValue());
	}

	private EnumerationValue getValueByName(String name) {
		for (EnumerationValue v : values.values()) {
			String n = v == null ? null : v.getName();
			if (n == name || (n != null && n.equalsIgnoreCase(name))) {
				return v;
			}
		}
		return null;
	}
}
